package com.bblocks.common.anti_reptile.rateLimiter;

import com.bblocks.common.anti_reptile.config.bean.RuleComm;
import com.bblocks.common.anti_reptile.constant.RuleTypeEnum;

import java.util.concurrent.TimeUnit;

/**
 * <p>Project: bb-anti-reptile - RateLimiterPlan</p>
 * <p>描述：限流处理器</p>
 *
 * @Author Zhao [125043150@qq.com]
 * @Date 2024/3/23 9:59
 * @Version 1.0
 * @since 8
 */
public abstract class RateLimiterPlan {

    /**
     *
     * 是否限制
     * 1、同步-本次将耗时同步限流控制-影响性能
     * 2、异步-本次直接返回非限制，下次请求可能被限制（如果处理的慢，将会导致后续未拦截住）
     * @param ruleTypeEnum
     * @param id ip/userId
     * @param url
     * @param rate 简单单元数量
     * @param rateInterval 间隔
     * @param unit
     * @return true=获取令牌了，false则限制了
     */
    public abstract boolean tryAcquire(RuleTypeEnum ruleTypeEnum, String id, String url, long rate, long rateInterval, TimeUnit unit);

/*    *//**
     * 重置限流器，暂时无务必要吧-一段时间后流量已经降下来了
     * @param ruleTypeEnum
     * @param key
     * @return
     *//*
    public  boolean resetLimiter(RuleTypeEnum ruleTypeEnum,String key){
        //rateLimiter.delete();
        return false;
    }*/


    /**
     * 是否黑名单了（动态的黑名单）
     * @param ruleTypeEnum
     * @param id 用户ID/IP
     */
    public abstract boolean isBlack(RuleTypeEnum ruleTypeEnum,String id);

    /**
     * 加入黑名单
     * @param rule
     * @param id
     * @param requestUrl 黑名单访问地址
     * @param time 黑名单时间
     * @param unit
     * @return
     */
    public abstract int joinBlack(RuleComm rule, String id, String requestUrl, long time, TimeUnit unit);

    /**
     * 退出黑名单
     * 1、限流器重置（看情况吧，非必须）
     * 2、退出验证码黑名单
     * @param rule
     * @param id
     * @return
     */
    public abstract int outBlack(RuleComm rule,String id);
}
